import {
	ws
} from '@/config/url.js'

// 心跳间隔、重连websocket间隔
const interval = 6000
// 重连最大次数
const maxReconnectMaxTime = 100

export default class WS {
	constructor(options) {
		// 配置
		this.options = options
		// WS实例
		this.socketTask = null

		// 正常关闭
		this.normalCloseFlag = false
		// 重新连接次数
		this.reconnectTime = 1
		// 重新连接Timer
		this.reconnectTimer = null
		// 心跳Timer
		this.heartTimer = null

		// 发起连接
		this.initWS()

		// 关闭WS
		this.close = () => {
			// 正常关闭状态
			this.normalCloseFlag = true
			// 关闭websocket
			this.socketTask.close()
			// 关闭心跳定时器
			clearInterval(this.heartTimer)
			// 关闭重连定时器
			clearTimeout(this.reconnectTimer)
		}
	}

	initWS() {
		// this.options.data 连接websocket所需参数
		// const url = ws + '/' + this.options.data.userId
		const url = ws
		this.socketTask = uni.connectSocket({
			url,
			success() {},
		})
		// 监听WS
		this.watchWS()
	}

	watchWS() {
		// 监听 WebSocket 连接打开事件
		this.socketTask.onOpen(() => {
			console.log('websocket连接成功！')
			// 连接成功
			this.options.onConnected()
			// 重置连接次数
			this.reconnectTime = 1
			// 发送心跳
			this.onHeartBeat()
			// 监听消息
			this.onMessage()
			// 关闭Toast
			uni.hideLoading()
		})

		// 监听websocket 错误
		this.socketTask.onError((errMsg) => {
			console.log('websocket连接错误！')
			// 关闭并重连
			if (!this.normalCloseFlag) {
				this.onDisconnected(errMsg)
			}
			// this.socketTask.close()
		})

		// 监听 WebSocket 连接关闭事件
		this.socketTask.onClose((errMsg) => {
			console.log('websocket连接断开！')
			// 连接错误，发起重连接
			if (!this.normalCloseFlag) {
				this.onDisconnected(errMsg)
			}
		})
	}

	// 监听消息
	onMessage() {
		// 监听websocket 收到消息
		this.socketTask.onMessage((res) => {
			if (res.data !== '链接成功') {
				this.options.onMessage(res.data)
			}
			//收到消息
			// if (res.data) {
			// 	// console.log(res);
			// 	this.options.onMessage(res.data)
			// } else {
			// 	console.log('未监听到消息')
			// }
		})
	}

	// 断开连接
	onDisconnected(res) {
		console.log('断开连接，', JSON.stringify(res))
		// 关闭心跳
		clearInterval(this.heartTimer)
		// 全局Toast提示，防止用户继续发送
		// uni.showLoading({
		// 	title: '消息收取中…'
		// })
		// 尝试重新连接
		this.onReconnect()
	}

	// 断线重连
	onReconnect() {
		clearTimeout(this.reconnectTimer)
		if (this.reconnectTime < maxReconnectMaxTime) {
			this.reconnectTimer = setTimeout(() => {
				console.log(`第【${this.reconnectTime}】次重新连接中……`)
				this.initWS()
				this.reconnectTime++
			}, interval)
		} else {
			// uni.showModal({
			// 	title: '温馨提示',
			// 	content: '服务器开小差啦~请返回聊天列表重试',
			// 	showCancel: false,
			// 	confirmText: '我知道了',
			// 	success: () => {
			// 		uni.navigateBack()
			// 	}
			// })
		}
	}

	/** @心跳 **/
	onHeartBeat() {
		let bind = JSON.stringify({
			"type": "bind",
			"uid": uni.getStorageSync('userInfo').id
		})
		this.socketTask.send({
			data: bind,
			success() {
				// console.log('心跳中')
			}
		})
		this.heartTimer = setInterval(() => {
			this.socketTask.send({
				data: bind,
				success() {
					// console.log('心跳中')
				}
			})
		}, interval)
	}
}
